package day12;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class ParseXmlDemo {

	public static void main(String[] args) {
		/*
		 * 解析emplist.xml文档，将所有的员工信息读取出来并转换为若干emp实例，存入一个List集合中
		 * 
		 * 接续XML流程：
		 * 1：创建SAXReader
		 * 2:使用SAXReader读取XML文档并返回Document对象
		 * 		这一步就是DOM解析耗时耗资源的体现
		 * 		因为DOM会将XML文档全部读取并以一个Document对象形式存于内存，Document对象用于描述解析的XML文档内容
		 * 3：根据Document对象获取根元素
		 * 4：按照xml的结构从根元素中开始逐级获取子元素以达到遍历xml的目的
		 * */
		try {
			//1
			SAXReader reader = new SAXReader();
			//2
			Document doc = reader.read(new FileInputStream("emplist.xml"));
			/*3获取根元素
			 * Element的每一个实例用于表示xml文档中的一个元素（一对标签）
			 * 这里获取的相当于是emplist.xml文档中的<list>标签
			 * */
			Element root = doc.getRootElement();
			/**
			 * Element提供了获取元素的相关方法:
			 * String getName()
			 * 获取当前标签的名字
			 * 
			 * List elements()
			 * 获取当前标签下的所有子标签
			 * 
			 * List elements(String name)
			 * 获取当前标签下所有同名子标签
			 * 
			 * Element element(String name)
			 * 获取自定名字的子标签
			 * 
			 * Attribute attribute(String name)
			 * 获取自定名字的属性
			 * 
			 * String getText()
			 * 获取当前标签中的文本(前提是确实是文本而不是子标签)
			 * */
			List<Emp> emplist = new ArrayList<Emp>();
			//遍历所有的<emp>标签并解析出该员工相关信息并以一个Emp实例保存然后将其存入emplist集合
			List<Element> elements = root.elements();
			//遍历所有的Emp标签并解析员工相关信息，以一个Emp实例保存然后将其存入empList集合
			for(Element empEle:elements) {
				//获取id
				Attribute idAttr = empEle.attribute("id");
				int id = Integer.parseInt(idAttr.getValue());
				//获取名字
				Element nameEle = empEle.element("name");
				String name = nameEle.getText();
				//获取年龄
				Element ageEle = empEle.element("age");
				int age = Integer.parseInt(ageEle.getText());
				//获取性别
				Element genderEle = empEle.element("gender");
				String gender = genderEle.getText();
				//获取工资
				Element salaryEle = empEle.element("salary");
				int salary = Integer.parseInt(salaryEle.getText());
				//实例存入集合
				emplist.add(new Emp(id,name,age,gender,salary));
				for(Emp emp:emplist) {
					System.out.println(emp);
				}
			}
			System.out.println("解析完毕");
			System.out.println("共"+ emplist.size() + "个员工");
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

}
